package field

import (
	"fmt"
	"yunj/pkg/yunj/core/builder/builderconsts"
	"yunj/pkg/yunj/core/builder/builderdto"
	"yunj/pkg/yunj/core/builder/form"
	"yunj/pkg/yunj/core/builder/form/field/action"
)

// 树-编辑
type TreeEdit struct {
	form.Field
	Nodes      []*builderdto.FormTreeEditNode `json:"nodes"`      // 节点
	CloseLevel uint                           `json:"closeLevel"` // 收起等级（默认0不收起）
	Sort       string                         `json:"sort"`       // 排序。no不允许排序、yes允许排序、level允许同级别内排序
	Actions    []action.ActionInterface       `json:"actions"`    // 操作项
}

func NewTreeEdit(id string, title ...string) *TreeEdit {
	f := &TreeEdit{}
	form.SetFieldInstance(&f.Field, f)
	f.SetFieldId(id)
	if len(title) > 0 {
		f.SetTitle(title[0])
	}
	return f
}

// 设置标题
func (f *TreeEdit) SetTitle(title string) *TreeEdit {
	f.Title = title
	return f
}

// 设置默认值
func (f *TreeEdit) SetDefault(def any) *TreeEdit {
	f.Default = def
	return f
}

// 设置描述
func (f *TreeEdit) SetDesc(desc string) *TreeEdit {
	f.Desc = desc
	return f
}

// 设置验证规则
func (f *TreeEdit) SetVerify(rule string) *TreeEdit {
	f.Verify = rule
	return f
}

// 设置验证标题
func (f *TreeEdit) SetVerifyTitle(verifyTitle string) *TreeEdit {
	f.VerifyTitle = verifyTitle
	return f
}

// 增加验证规则
func (f *TreeEdit) AddVerify(rule string) *TreeEdit {
	f.AddFieldVerify(rule)
	return f
}

// 设置是否只读
func (f *TreeEdit) SetReadonly(yes bool) *TreeEdit {
	f.Readonly = yes
	return f
}

// 设置栅格布局
// 超小屏幕(手机<768px)、小屏幕(平板≥768px)、中等屏幕(桌面≥992px)、大型屏幕(桌面≥1200px)、超大屏幕(桌面≥1400px)
// 总列数：12
func (f *TreeEdit) SetGrid(num ...any) *TreeEdit {
	f.Grid = num
	return f
}

// 设置权限
func (f *TreeEdit) SetAuth(auth string) *TreeEdit {
	f.Auth = auth
	return f
}

// 设置节点
func (f *TreeEdit) SetNodes(nodes []*builderdto.FormTreeEditNode) *TreeEdit {
	f.Nodes = nodes
	return f
}

// 设置收起等级（默认0不收起）
func (f *TreeEdit) SetCloseLevel(level uint) *TreeEdit {
	f.CloseLevel = level
	return f
}

// 设置排序。0不允许排序、1允许排序、2允许同级别内排序
func (f *TreeEdit) SetSort(sort string) *TreeEdit {
	f.Sort = sort
	return f
}

// 设置操作项
func (f *TreeEdit) SetActions(actions []action.ActionInterface) *TreeEdit {
	f.Actions = actions
	return f
}

// 处理属性
func (f *TreeEdit) HandleAttr() error {
	//Sort
	if f.Sort == "" {
		f.Sort = builderconsts.FORM_TREE_SORT_NO
	}
	// Nodes
	err := f.HandleNodes()
	if err != nil {
		return f.SetError(err)
	}
	// Actions
	err = f.HandleActions()
	if err != nil {
		return f.SetError(err)
	}

	return nil
}

// 处理节点
func (f *TreeEdit) HandleNodes() (err error) {
	for i, node := range f.Nodes {
		// 判断节点id
		if node.Id == nil {
			err = fmt.Errorf("节点 Nodes[%v].Id 不能为空", i)
			return
		}
	}
	return
}

// 处理操作项
func (f *TreeEdit) HandleActions() (err error) {
	var hasAuth bool
	actions := make([]action.ActionInterface, 0, len(f.Actions))
	for _, ac := range f.Actions {
		hasAuth, err = ac.RenderHandle(f.GinContext, f.FormId)
		if err != nil {
			return
		}
		// 没有权限
		if !hasAuth {
			continue
		}
		actions = append(actions, ac)
	}
	f.Actions = actions
	return
}
